package com.zjcode.cdcer.service.impl;

import com.chinatechstar.component.commons.entity.MPage;
import com.chinatechstar.component.commons.result.PaginationBuilder;
import com.chinatechstar.component.commons.service.BaseService;
import com.chinatechstar.component.commons.supports.PageData;
import com.chinatechstar.component.commons.utils.StringUtils;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.zjcode.cdcer.mapper.*;
import com.zjcode.cdcer.model.TaskAssignment;
import com.zjcode.cdcer.model.TkmSysOrg;
import com.zjcode.cdcer.model.TkmSysUser;
import com.zjcode.cdcer.service.WorkReportService;
import org.apache.commons.lang3.ObjectUtils;
import org.codehaus.groovy.util.ListHashMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestParam;

import java.io.Serializable;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

@Service
public class WorkReportServiceImpl implements WorkReportService, BaseService {

    @Autowired
    private TkmSysOrgMapper orgMapper;

    @Autowired
    private TkmSysUserMapper userMapper;

    @Autowired
    private TaskAssignmentMapper taskAssignmentMapper;

    @Autowired
    private ZjcodeSelfTestInfoMapper zjcodeSelfTestInfoMapper;

    @Autowired
    private CerSysteminitImportInfoMapper cerSysteminitImportInfoMapper;

    @Autowired
    private CerTreatmentInfoMapper cerTreatmentInfoMapper;

    @Autowired
    private FollowUpListMapper followUpListMapper;

    @Override
    public Map<String, Object> selWorkReport(PageData pageData) {
        Long userId = Long.valueOf(pageData.get("user").toString());
        TkmSysUser userInfo = userMapper.selectByPrimaryKey(userId);
        TkmSysOrg orgInfo = orgMapper.selectByPrimaryKey(userInfo.getOrgId());
        pageData.put("ancestors", orgInfo.getAncestors());
        // 2023-12-08更新，如果登录用户属于筛查机构，那么只能看到自己机构的数据
        if (orgInfo.getOrgType().equals("org") && orgInfo.getExtFlag().equals("2")) {
            pageData.put("orgName", orgInfo.getOrgName());
        }

        // 解析分页参数
        MPage mPage = getPageInfo(pageData);
        Page<Object> page = PageHelper.startPage(mPage.getCurrentPage(), mPage.getPageSize());

        // 根据当前登录用户查询任务分配（合计——任务数）
        List<LinkedHashMap<String, Object>> list = taskAssignmentMapper.selList(pageData);
        if (StringUtils.isNotEmpty(list)) {
            List<Long> orgIdList = list.stream().map(item -> Long.valueOf(item.get("institution_id").toString())).collect(Collectors.toList());
            // 合计——自测表
            Map<String, LinkedHashMap<String, Object>> zcNumMap = dataConversion(zjcodeSelfTestInfoMapper.selByOrgIdList(orgIdList, pageData));

            // 合计——完成数（内镜完成数）
            Map<String, LinkedHashMap<String, Object>> njNumMap = dataConversion(cerSysteminitImportInfoMapper.selNjNumByOrgId(orgIdList, null, pageData));

            // 合计——病例数（治疗列表）也是应治疗数
            Map<String, LinkedHashMap<String, Object>> blNumMap = dataConversion(cerTreatmentInfoMapper.selBlNumByOrgId(orgIdList, null, null, pageData));

            // 合计——早诊数（高级别上皮内瘤变及其早期癌：10，13，21，142，25，26，27，28）
            Map<String, LinkedHashMap<String, Object>> zzNumMap = dataConversion(cerSysteminitImportInfoMapper.selZzNumByOrgId(orgIdList, null, pageData));

            // 合计——治疗数（治疗列表实际治疗数量）（1治疗，2不治疗）
            Map<String, LinkedHashMap<String, Object>> zlNumMap = dataConversion(cerTreatmentInfoMapper.selBlNumByOrgId(orgIdList, 1, null, pageData));

            // 合计——高级别上皮内瘤变及其以上病变：10，11，13，141，142，15，19，21，221，222，23，24，25，26，27，28
            Map<String, LinkedHashMap<String, Object>> bbNumMap = dataConversion(cerSysteminitImportInfoMapper.selBbNumByOrgId(orgIdList, null, pageData));
            //===================================================================================================================================================
            // 初筛——完成数（内镜完成数）（0初筛，1随访）
            Map<String, LinkedHashMap<String, Object>> njCsMap = dataConversion(cerSysteminitImportInfoMapper.selNjNumByOrgId(orgIdList, 0, pageData));

            // 初筛——病例数（治疗列表）也是应治疗数
            Map<String, LinkedHashMap<String, Object>> blCsMap = dataConversion(cerTreatmentInfoMapper.selBlNumByOrgId(orgIdList, null, 0, pageData));

            // 初筛——早诊数（高级别上皮内瘤变及其早期癌：10，13，21，142，25，26，27，28）
            Map<String, LinkedHashMap<String, Object>> zzCsMap = dataConversion(cerSysteminitImportInfoMapper.selZzNumByOrgId(orgIdList, 0, pageData));

            // 初筛——治疗数（治疗列表实际治疗数量）（1治疗，2不治疗）
            Map<String, LinkedHashMap<String, Object>> zlCsMap = dataConversion(cerTreatmentInfoMapper.selBlNumByOrgId(orgIdList, 1, 0, pageData));

            // 初筛——高级别上皮内瘤变及其以上病变：10，11，13，141，142，15，19，21，221，222，23，24，25，26，27，28
            Map<String, LinkedHashMap<String, Object>> bbCsMap = dataConversion(cerSysteminitImportInfoMapper.selBbNumByOrgId(orgIdList, 0, pageData));
            //===================================================================================================================================================
            // 随访——应随访数
            Map<String, LinkedHashMap<String, Object>> ySfMap = dataConversion(followUpListMapper.selYSfNumByOrgId(orgIdList, pageData));

            // 随访——随访数
            Map<String, LinkedHashMap<String, Object>> sfMap = dataConversion(followUpListMapper.selSfNumByOrgId(orgIdList, pageData));

            // 随访——病例数（治疗列表）也是应治疗数（0初筛，1随访）
            Map<String, LinkedHashMap<String, Object>> blSfMap = dataConversion(cerTreatmentInfoMapper.selBlNumByOrgId(orgIdList, null, 1, pageData));

            // 随访—早诊数（高级别上皮内瘤变及其早期癌：10，13，21，142，25，26，27，28）
            Map<String, LinkedHashMap<String, Object>> zzSfMap = dataConversion(cerSysteminitImportInfoMapper.selZzNumByOrgId(orgIdList, 1, pageData));

            // 随访——治疗数（治疗列表实际治疗数量）（1治疗，2不治疗）
            Map<String, LinkedHashMap<String, Object>> zlSfMap = dataConversion(cerTreatmentInfoMapper.selBlNumByOrgId(orgIdList, 1, 1, pageData));

            // 随访——高级别上皮内瘤变及其以上病变：10，11，13，141，142，15，19，21，221，222，23，24，25，26，27，28
            Map<String, LinkedHashMap<String, Object>> bbSfMap = dataConversion(cerSysteminitImportInfoMapper.selBbNumByOrgId(orgIdList, 1, pageData));

            // 数据组装
            list.forEach(item -> {
                // 合计——自测表
                item.put("zchj", zcNumMap.get(item.get("institution_id").toString()) == null ? 0 : zcNumMap.get(item.get("institution_id").toString()).get("zcNum").toString());
                // 合计——完成数
                item.put("wchj", njNumMap.get(item.get("institution_id").toString()) == null ? 0 : njNumMap.get(item.get("institution_id").toString()).get("njNum").toString());
                // 合计——完成率（完成数/任务数）
                item.put("wclhj", item.get("year_task_volume") == null ? 0 : stringFormat(Double.parseDouble(item.get("wchj").toString()) / Double.parseDouble(item.get("year_task_volume").toString())));
                // 合计——病例数
                item.put("blhj", blNumMap.get(item.get("institution_id").toString()) == null ? 0 : blNumMap.get(item.get("institution_id").toString()).get("blNum").toString());
                // 合计——检出率（高级别上皮内瘤变及其以上病变/病例数）
                item.put("jclhj", Integer.parseInt(item.get("blhj").toString()) == 0 ? 0 : bbNumMap.get(item.get("institution_id").toString()) == null ? 0 : stringFormat(Double.parseDouble(bbNumMap.get(item.get("institution_id").toString()).get("bbNum").toString()) / Double.parseDouble(item.get("blhj").toString())));
                // 合计——早诊数
                item.put("zzhj", zzNumMap.get(item.get("institution_id").toString()) == null ? 0 : zzNumMap.get(item.get("institution_id").toString()).get("zzNum").toString());
                // 合计——早诊率（早诊数/高级别上皮内瘤变及其以上病变）
                item.put("zzlhj", bbNumMap.get(item.get("institution_id").toString()) == null ? 0 : stringFormat(Double.parseDouble(item.get("zzhj").toString()) / Double.parseDouble(bbNumMap.get(item.get("institution_id").toString()).get("bbNum").toString())));
                // 合计——治疗数
                item.put("zlhj", zlNumMap.get(item.get("institution_id").toString()) == null ? 0 : zlNumMap.get(item.get("institution_id").toString()).get("blNum").toString());
                // 合计——治疗率（治疗数/病例数）
                item.put("zllhj", Integer.parseInt(item.get("blhj").toString()) == 0 ? 0 : stringFormat(Double.parseDouble(item.get("zlhj").toString()) / Double.parseDouble(item.get("blhj").toString())));

                // 初筛——完成数
                item.put("wcCs", njCsMap.get(item.get("institution_id").toString()) == null ? 0 : njCsMap.get(item.get("institution_id").toString()).get("njNum").toString());
                // 初筛——病例数
                item.put("blCs", blCsMap.get(item.get("institution_id").toString()) == null ? 0 : blCsMap.get(item.get("institution_id").toString()).get("blNum").toString());
                // 初筛——检出率（高级别上皮内瘤变及其以上病变/病例数）
                item.put("jclCs", Integer.parseInt(item.get("blCs").toString()) == 0 ? 0 : bbCsMap.get(item.get("institution_id").toString()) == null ? 0 : stringFormat(Double.parseDouble(bbCsMap.get(item.get("institution_id").toString()).get("bbNum").toString()) / Double.parseDouble(item.get("blCs").toString())));
                // 初筛——早诊数
                item.put("zzCs", zzCsMap.get(item.get("institution_id").toString()) == null ? 0 : zzCsMap.get(item.get("institution_id").toString()).get("zzNum").toString());
                // 初筛——早诊率（早诊数/高级别上皮内瘤变及其以上病变）
                item.put("zzlCs", bbCsMap.get(item.get("institution_id").toString()) == null ? 0 : stringFormat(Double.parseDouble(item.get("zzCs").toString()) / Double.parseDouble(bbCsMap.get(item.get("institution_id").toString()).get("bbNum").toString())));
                // 初筛——治疗数
                item.put("zlCs", zlCsMap.get(item.get("institution_id").toString()) == null ? 0 : zlCsMap.get(item.get("institution_id").toString()).get("blNum").toString());
                // 初筛——治疗率（治疗数/病例数）
                item.put("zllCs", Integer.parseInt(item.get("blCs").toString()) == 0 ? 0 : stringFormat(Double.parseDouble(item.get("zlCs").toString()) / Double.parseDouble(item.get("blCs").toString())));

                // 随访——应随访数
                item.put("ySfNum", ySfMap.get(item.get("institution_id").toString()) == null ? 0 : ySfMap.get(item.get("institution_id").toString()).get("ySfNum"));
                // 随访——随访数
                item.put("sfNum", sfMap.get(item.get("institution_id").toString()) == null ? 0 : sfMap.get(item.get("institution_id").toString()).get("sfNum"));
                // 随访率（随访数/应随访数）
                item.put("sfl", Integer.parseInt(item.get("ySfNum").toString()) == 0 ? 0 : stringFormat(Double.parseDouble(item.get("sfNum").toString()) / Double.parseDouble(item.get("ySfNum").toString())));
                // 随访——病例数
                item.put("blSf", blSfMap.get(item.get("institution_id").toString()) == null ? 0 : blSfMap.get(item.get("institution_id").toString()).get("blNum").toString());
                // 随访——检出率（高级别上皮内瘤变及其以上病变/病例数）
                item.put("jclSf", Integer.parseInt(item.get("blSf").toString()) == 0 ? 0 : bbSfMap.get(item.get("institution_id").toString()) == null ? 0 : stringFormat(Double.parseDouble(bbSfMap.get(item.get("institution_id").toString()).get("bbNum").toString()) / Double.parseDouble(item.get("blSf").toString())));
                // 随访——早诊数
                item.put("zzSf", zzSfMap.get(item.get("institution_id").toString()) == null ? 0 : zzSfMap.get(item.get("institution_id").toString()).get("zzNum").toString());
                // 随访——早诊率（早诊数/高级别上皮内瘤变及其以上病变）
                item.put("zzlSf", bbSfMap.get(item.get("institution_id").toString()) == null ? 0 : stringFormat(Double.parseDouble(item.get("zzSf").toString()) / Double.parseDouble(bbSfMap.get(item.get("institution_id").toString()).get("bbNum").toString())));
                // 随访——治疗数
                item.put("zlSf", zlSfMap.get(item.get("institution_id").toString()) == null ? 0 : zlSfMap.get(item.get("institution_id").toString()).get("blNum").toString());
                // 随访——治疗率（治疗数/病例数）
                item.put("zllSf", Integer.parseInt(item.get("blSf").toString()) == 0 ? 0 : stringFormat(Double.parseDouble(item.get("zlSf").toString()) / Double.parseDouble(item.get("blSf").toString())));
            });
        }
        return PaginationBuilder.buildResult(list,
                page.getTotal(),
                mPage.getCurrentPage(),
                mPage.getPageSize());
    }

    @Override
    public List<LinkedHashMap<String, Object>> queryAllExportData(PageData pageData) {
        pageData.put("currentPage", "1");
        pageData.put("pageSize", "99999");
        List<LinkedHashMap<String, Object>> list = (List<LinkedHashMap<String, Object>>) selWorkReport(pageData).get("list");
        List<LinkedHashMap<String, Object>> returnList = new ArrayList<>();
        if (StringUtils.isNotEmpty(list)) {
            list.forEach(item -> {
                LinkedHashMap<String, Object> linkedHashMap = new LinkedHashMap<>();
                linkedHashMap.put("province", item.get("province"));
                linkedHashMap.put("city", item.get("city"));
                linkedHashMap.put("district", item.get("district"));
                linkedHashMap.put("institution", item.get("institution"));
                linkedHashMap.put("year_task_volume", item.get("year_task_volume"));
                linkedHashMap.put("zchj", item.get("zchj"));
                linkedHashMap.put("wchj", item.get("wchj"));
                linkedHashMap.put("wclhj", item.get("wclhj"));
                linkedHashMap.put("blhj", item.get("blhj"));
                linkedHashMap.put("jclhj", item.get("jclhj"));
                linkedHashMap.put("zzhj", item.get("zzhj"));
                linkedHashMap.put("zzlhj", item.get("zzlhj"));
                linkedHashMap.put("zlhj", item.get("zlhj"));
                linkedHashMap.put("zllhj", item.get("zllhj"));
                linkedHashMap.put("wcCs", item.get("wcCs"));
                linkedHashMap.put("blCs", item.get("blCs"));
                linkedHashMap.put("jclCs", item.get("jclCs"));
                linkedHashMap.put("zzCs", item.get("zzCs"));
                linkedHashMap.put("zzlCs", item.get("zzlCs"));
                linkedHashMap.put("zlCs", item.get("zlCs"));
                linkedHashMap.put("zllCs", item.get("zllCs"));
                linkedHashMap.put("first_screening_task_volume", item.get("first_screening_task_volume"));
                linkedHashMap.put("follow_task_volume", item.get("follow_task_volume"));
                linkedHashMap.put("sfl", item.get("sfl"));
                linkedHashMap.put("blSf", item.get("blSf"));
                linkedHashMap.put("jclSf", item.get("jclSf"));
                linkedHashMap.put("zzSf", item.get("zzSf"));
                linkedHashMap.put("zzlSf", item.get("zzlSf"));
                linkedHashMap.put("zlSf", item.get("zlSf"));
                linkedHashMap.put("zllSf", item.get("zllSf"));
                returnList.add(linkedHashMap);
            });
        }
        return returnList;
    }

    @Override
    public Map<String, Object> getScreenData(String year) {
        // 指标概览
        // 任务数
        Integer allTaskNum = taskAssignmentMapper.selAllTaskNum(year);
        // 问卷人数
        Integer selfTestNum = zjcodeSelfTestInfoMapper.selSelfTestNum(year,null);
        // 高危人数 todo
        Integer highRiskNum = zjcodeSelfTestInfoMapper.selSelfTestNum(year, 1);
        // 内镜检查数
        Integer neigongNum = cerSysteminitImportInfoMapper.selNeigongNum(year);

        // 阳性检出数
        Integer positiveNum = cerSysteminitImportInfoMapper.selPositiveNum("1",year);
        // 阴性检出数
        Integer  negativeNum = cerSysteminitImportInfoMapper.selPositiveNum("2",year);

        // 早诊数
        Integer zzNum = cerSysteminitImportInfoMapper.selZzNum(year);
        // 高级别上皮内瘤变及其以上病变
        Integer blNum = cerSysteminitImportInfoMapper.selBbNum(year);

        // 治疗数
        Integer treatmentNum = cerTreatmentInfoMapper.selTreatmentNum("1",year);
        // 病例数
        Integer caseNum = cerTreatmentInfoMapper.selTreatmentNum(null,year);

        // 随访数量
        Integer followupNum = followUpListMapper.selFollowupNum(year);
        // 应随访数
        Integer followupNumAll = followUpListMapper.selFollowupNumAll(year);

        //指标概览数据组装
        Map<String, Object> map = new ListHashMap<>();
        // 任务数
        map.put("allTaskNum", allTaskNum);
        // 问卷人数
        map.put("selfTestNum", selfTestNum);
        // 高危人数
        map.put("highRiskNum", highRiskNum);
        // 内镜检查数
        map.put("neigongNum", neigongNum);
        // 阳性检出数
        map.put("positiveNum", positiveNum);
        // 阳性检出率
        map.put("positiveL", positiveNum.equals(0) && negativeNum.equals(0) ? 0.00 : stringFormat((double) positiveNum / (double) (positiveNum + negativeNum)));
        // 早诊数
        map.put("zzNum", zzNum);
        // 早诊率
        map.put("zzL", blNum.equals(0) ? 0.00 : stringFormat((double) zzNum / (double) blNum));
        // 治疗数
        map.put("treatmentNum", treatmentNum);
        // 治疗率
        map.put("treatmentL", caseNum.equals(0) ? 0.00 : stringFormat((double) treatmentNum / (double) caseNum));
        // 随访数量
        map.put("followupNum", followupNum);
        // 随访数率
        map.put("followupL", followupNumAll.equals(0) ? 0.00 : stringFormat((double) followupNum / (double) followupNumAll));

        // 各医院数据上报情况
//        List<Map<String, Object>> list = getDataInit();

        Map<String, Object> returnMap = new LinkedHashMap<>();
        returnMap.put("zbgl", map);
//        returnMap.put("list", list);
        return returnMap;
    }

    public Map<String, Object> getHospitalDataInit(PageData pageData){
        Map<String, Object> returnMap = new LinkedHashMap<>();
        List<Map<String, Object>> list = getDataInit(pageData);
        returnMap.put("list", list);
        return returnMap;
    }

    /**
     * 各医院数据上报情况
     * @param pageData 年份 \ 机构id
     * @return list
     */
    private List<Map<String, Object>> getDataInit(PageData pageData) {
        String cityCode = pageData.getString("cityCode");
        List<Long> orgIdList = new ArrayList<>();
        // 1、查满足配置【zjcode_sys_param表】的医院机构集合
        List<TkmSysOrg> orgList = getTkmSysOrgs();
        // 2、根据检索条件判断，查出满足条件的orgIdList
        // （1）cityCode为null，说明查所有；
        if(ObjectUtils.isEmpty(cityCode)){
            String paramValue = cerSysteminitImportInfoMapper.selOrgId();
            orgIdList = Arrays.stream(paramValue.split(",")).map(Long::valueOf).collect(Collectors.toList());
        }else{
            // （2）cityCode不为null，
            String orgIdStr = pageData.getString("orgId");
            if(ObjectUtils.isEmpty(orgIdStr)){
                // （2.1）orgId为null，查某一个市下的orgIdList
                List<TkmSysOrg> cityOrgList = orgList.stream().filter(t -> t.getCityCode().equals(cityCode)).collect(Collectors.toList());
                orgIdList = cityOrgList.stream().map(TkmSysOrg::getId).collect(Collectors.toList());
                // 过滤出指定市下的机构
                orgList = orgList.stream().filter(t -> t.getCityCode().equals(cityCode)).collect(Collectors.toList());
            }else{
                // （2.2）orgId不为null，查指定的orgId
                orgIdList.add(Long.parseLong(orgIdStr));
                // 过滤出指定机构
                orgList = orgList.stream().filter(t -> t.getId().equals(Long.parseLong(orgIdStr))).collect(Collectors.toList());
            }
        }
        // 查询任务分配数据
        List<TaskAssignment> assignmentList = taskAssignmentMapper.selByInstitutionId(orgIdList,pageData);
        // 问卷完成数量
        Map<String, LinkedHashMap<String, Object>> wjMap = dataConversion(zjcodeSelfTestInfoMapper.selByOrgIdList(orgIdList, pageData));
        // 随访完成数量
        Map<String, LinkedHashMap<String, Object>> sfMap = dataConversion(followUpListMapper.selSfNumByOrgId(orgIdList, pageData));
        // 治疗完成数量
        Map<String, LinkedHashMap<String, Object>> zlMap = dataConversion(cerTreatmentInfoMapper.selBlNumByOrgId(orgIdList, 1, null, pageData));
        // 应治疗人数总量
        Map<String, LinkedHashMap<String, Object>> yzlMap = dataConversion(cerTreatmentInfoMapper.selBlNumByOrgId(orgIdList, null, null, pageData));
        // 数据上报数量
        Map<String, LinkedHashMap<String, Object>> reportMap = dataConversion(cerSysteminitImportInfoMapper.selDataNumByOrgId(orgIdList, pageData));

        List<Map<String, Object>> list = new ArrayList<>();
        assembleAssignmentForMap(orgList, assignmentList, wjMap, sfMap, yzlMap, zlMap, reportMap, list);
//        assignmentListForMap(assignmentList, wjMap, sfMap, yzlMap, zlMap, reportMap, list);
        return list;
    }

    /**
     * 封装数据：
     * @param orgList
     * @param assignmentList
     * @param wjMap
     * @param sfMap
     * @param yzlMap
     * @param zlMap
     * @param reportMap
     * @param list
     */
    private void assembleAssignmentForMap(List<TkmSysOrg> orgList, List<TaskAssignment> assignmentList, Map<String,
            LinkedHashMap<String, Object>> wjMap, Map<String, LinkedHashMap<String, Object>> sfMap, Map<String,
            LinkedHashMap<String, Object>> yzlMap, Map<String, LinkedHashMap<String, Object>> zlMap, Map<String,
            LinkedHashMap<String, Object>> reportMap, List<Map<String, Object>> list) {
        if (StringUtils.isNotEmpty(orgList)) {
            orgList.forEach(each->{
                Map<String, Object> iMap = new HashMap<>();
                iMap.put("orgId", each.getId());
                iMap.put("orgName", each.getOrgName());
                Integer csNum =null;
                Object csOverNum = null;
                Object csNoneNum =null ;
                Serializable csOverL = 0.00;
                double csNoneL =  0.0;
                Integer sfNum = null;
                Object sfOverNum = null;
                Object sfNoneNum = null;
                Serializable sfOverL = 0.00;
                double sfNoneL =  0.0;
                Object zlNum =null ;
                Object zlOverNum =  null;
                Object zlNoneNum = null ;
                Serializable zlOverL =  0.00 ;
                double zlNoneL =0.0 ;
                Integer rwNum =  null ;
                Object rwOverNum = null ;
                Object rwNoneNum =  null;
                Serializable rwOverL =  0.00;
                double rwNoneL =  0.0 ;
                for(TaskAssignment item : assignmentList){
                    if(Objects.equals(item.getInstitutionId(), each.getId().toString())){
                        csNum = item.getFirstScreeningTaskVolume() == null ? null : item.getFirstScreeningTaskVolume();
                        csOverNum = wjMap.get(item.getInstitutionId()) == null ? null : wjMap.get(item.getInstitutionId()).get("zcNum");
                        csNoneNum =csNum == null ? null : csOverNum == null ? csNum: Integer.parseInt(csNum.toString()) - Integer.parseInt(csOverNum.toString());
                        csOverL = csNum == null ? 0.00 : csOverNum== null ? 0.00 : stringFormat(Double.parseDouble(csOverNum.toString()) / Double.parseDouble(csNum.toString()));
                        csNoneL = Double.parseDouble(csOverL.toString()) == 0.0 ? 0.0 : 100.00 - Double.parseDouble(csOverL.toString());

                        sfNum = item.getFollowTaskVolume() == null ? null : item.getFollowTaskVolume();
                        sfOverNum = sfMap.get(item.getInstitutionId()) == null ? null : sfMap.get(item.getInstitutionId()).get("sfNum");
                        sfNoneNum = sfNum == null ? null : sfOverNum== null ? sfNum : Integer.parseInt(sfNum.toString()) - Integer.parseInt(sfOverNum.toString());
                        sfOverL = sfNum == null ? 0.00 : sfOverNum == null ? 0.00 : stringFormat(Double.parseDouble(sfOverNum.toString()) / Double.parseDouble(sfNum.toString()));
                        sfNoneL = Double.parseDouble(sfOverL.toString()) == 0.0 ? 0.0 : 100.00 - Double.parseDouble(sfOverL.toString());

                        zlNum = yzlMap.get(item.getInstitutionId()) == null ? null : yzlMap.get(item.getInstitutionId()).get("blNum");
                        zlOverNum = zlMap.get(item.getInstitutionId()) == null ? null : zlMap.get(item.getInstitutionId()).get("blNum");
                        zlNoneNum = zlNum == null ? null : zlOverNum == null ? zlNum : Integer.parseInt(zlNum.toString()) - Integer.parseInt(zlOverNum.toString());
                        zlOverL = zlNum== null ? 0.00 : zlOverNum == null ? 0.00 : stringFormat(Double.parseDouble(zlOverNum.toString()) / Double.parseDouble(zlNum.toString()));
                        zlNoneL = Double.parseDouble(zlOverL.toString()) == 0.0 ? 0.0 : 100.00 - Double.parseDouble(zlOverL.toString());

                        rwNum = item.getYearTaskVolume() == null ? null : item.getYearTaskVolume();
                        rwOverNum = reportMap.get(item.getInstitutionId()) == null ? null : reportMap.get(item.getInstitutionId()).get("num");
                        rwNoneNum = rwNum == null ? null : rwOverNum == null ? rwNum : Integer.parseInt(rwNum.toString()) - Integer.parseInt(rwOverNum.toString());
                        rwOverL = rwNum == null ? 0.00 : rwOverNum == null ? 0.00 : stringFormat(Double.parseDouble(rwOverNum.toString()) / Double.parseDouble(rwNum.toString()));
                        rwNoneL = Double.parseDouble(rwOverL.toString()) == 0.0 ? 0.0 : 100.00 - Double.parseDouble(rwOverL.toString());
                    }
                }
                // 初筛任务量
                iMap.put("csNum",csNum);
                // 初筛完成量（问卷完成数量）
                iMap.put("csOverNum", csOverNum);
                // 初筛未完成
                iMap.put("csNoneNum", csNoneNum);
                // 初筛完成率
                iMap.put("csOverL",csOverL);
                // 初筛未完成率
                iMap.put("csNoneL",csNoneL);
                // 随访任务量
                iMap.put("sfNum", sfNum);
                // 随访完成量
                iMap.put("sfOverNum", sfOverNum);
                // 随访未完成
                iMap.put("sfNoneNum",sfNoneNum);
                // 随访完成率
                iMap.put("sfOverL",sfOverL);
                // 随访未完成率
                iMap.put("sfNoneL",sfNoneL);
                // 治疗量
                iMap.put("zlNum", zlNum);
                // 治疗完成量
                iMap.put("zlOverNum", zlOverNum);
                // 治疗未完成
                iMap.put("zlNoneNum",zlNoneNum);
                // 治疗完成率
                iMap.put("zlOverL",zlOverL);
                // 治疗未完成率
                iMap.put("zlNoneL",zlNoneL);
                // 任务量
                iMap.put("rwNum", rwNum);
                // 任务完成量（问卷完成数量）
                iMap.put("rwOverNum", rwOverNum);
                // 任务未完成
                iMap.put("rwNoneNum",rwNoneNum);
                // 任务完成率
                iMap.put("rwOverL",rwOverL);
                // 任务未完成率
                iMap.put("rwNoneL",rwNoneL);
                list.add(iMap);
            });
        }
    }

    /**
     * 原始列表转map
     * @param assignmentList
     * @param wjMap
     * @param sfMap
     * @param yzlMap
     * @param zlMap
     * @param reportMap
     * @param list
     */
    private void assignmentListForMap(List<TaskAssignment> assignmentList, Map<String, LinkedHashMap<String, Object>> wjMap, Map<String, LinkedHashMap<String, Object>> sfMap, Map<String, LinkedHashMap<String, Object>> yzlMap, Map<String, LinkedHashMap<String, Object>> zlMap, Map<String, LinkedHashMap<String, Object>> reportMap, List<Map<String, Object>> list) {
        if (StringUtils.isNotEmpty(assignmentList)) {
            assignmentList.forEach(item -> {
                Map<String, Object> iMap = new HashMap<>();
                iMap.put("orgId", item.getInstitutionId());
                iMap.put("orgName", item.getInstitution());
                // 初筛任务量
                iMap.put("csNum", item.getFirstScreeningTaskVolume() == null ? null : item.getFirstScreeningTaskVolume());
                // 初筛完成量（问卷完成数量）
                iMap.put("csOverNum", wjMap.get(item.getInstitutionId()) == null ? null : wjMap.get(item.getInstitutionId()).get("zcNum"));
                // 初筛未完成
                iMap.put("csNoneNum", iMap.get("csNum") == null ? null : iMap.get("csOverNum") == null ? iMap.get("csNum") : Integer.parseInt(iMap.get("csNum").toString()) - Integer.parseInt(iMap.get("csOverNum").toString()));
                // 初筛完成率
                iMap.put("csOverL", iMap.get("csNum") == null ? 0.00 : iMap.get("csOverNum") == null ? 0.00 : stringFormat(Double.parseDouble(iMap.get("csOverNum").toString()) / Double.parseDouble(iMap.get("csNum").toString())));
                // 初筛未完成率
                iMap.put("csNoneL", Double.parseDouble(iMap.get("csOverL").toString()) == 0.0 ? 0.0 : 100.00 - Double.parseDouble(iMap.get("csOverL").toString()));

                // 随访任务量
                iMap.put("sfNum", item.getFollowTaskVolume() == null ? null : item.getFollowTaskVolume());
                // 随访完成量
                iMap.put("sfOverNum", sfMap.get(item.getInstitutionId()) == null ? null : sfMap.get(item.getInstitutionId()).get("sfNum"));
                // 随访未完成
                iMap.put("sfNoneNum", iMap.get("sfNum") == null ? null : iMap.get("sfOverNum") == null ? iMap.get("sfNum") : Integer.parseInt(iMap.get("sfNum").toString()) - Integer.parseInt(iMap.get("sfOverNum").toString()));
                // 随访完成率
                iMap.put("sfOverL", iMap.get("sfNum") == null ? 0.00 : iMap.get("sfOverNum") == null ? 0.00 : stringFormat(Double.parseDouble(iMap.get("sfOverNum").toString()) / Double.parseDouble(iMap.get("sfNum").toString())));
                // 随访未完成率
                iMap.put("sfNoneL", Double.parseDouble(iMap.get("sfOverL").toString()) == 0.0 ? 0.0 : 100.00 - Double.parseDouble(iMap.get("sfOverL").toString()));

                // 治疗量
                iMap.put("zlNum", yzlMap.get(item.getInstitutionId()) == null ? null : yzlMap.get(item.getInstitutionId()).get("blNum"));
                // 治疗完成量
                iMap.put("zlOverNum", zlMap.get(item.getInstitutionId()) == null ? null : zlMap.get(item.getInstitutionId()).get("blNum"));
                // 治疗未完成
                iMap.put("zlNoneNum", iMap.get("zlNum") == null ? null : iMap.get("zlOverNum") == null ? iMap.get("zlNum") : Integer.parseInt(iMap.get("zlNum").toString()) - Integer.parseInt(iMap.get("zlOverNum").toString()));
                // 治疗完成率
                iMap.put("zlOverL", iMap.get("zlNum") == null ? 0.00 : iMap.get("zlOverNum") == null ? 0.00 : stringFormat(Double.parseDouble(iMap.get("zlOverNum").toString()) / Double.parseDouble(iMap.get("zlNum").toString())));
                // 治疗未完成率
                iMap.put("zlNoneL", Double.parseDouble(iMap.get("zlOverL").toString()) == 0.0 ? 0.0 : 100.00 - Double.parseDouble(iMap.get("zlOverL").toString()));

                // 任务量
                iMap.put("rwNum", item.getYearTaskVolume() == null ? null : item.getYearTaskVolume());
                // 任务完成量（问卷完成数量）
                iMap.put("rwOverNum", reportMap.get(item.getInstitutionId()) == null ? null : reportMap.get(item.getInstitutionId()).get("num"));
                // 任务未完成
                iMap.put("rwNoneNum", iMap.get("rwNum") == null ? null : iMap.get("rwOverNum") == null ? iMap.get("rwNum") : Integer.parseInt(iMap.get("rwNum").toString()) - Integer.parseInt(iMap.get("rwOverNum").toString()));
                // 任务完成率
                iMap.put("rwOverL", iMap.get("rwNum") == null ? 0.00 : iMap.get("rwOverNum") == null ? 0.00 : stringFormat(Double.parseDouble(iMap.get("rwOverNum").toString()) / Double.parseDouble(iMap.get("rwNum").toString())));
                // 任务未完成率
                iMap.put("rwNoneL", Double.parseDouble(iMap.get("rwOverL").toString()) == 0.0 ? 0.0 : 100.00 - Double.parseDouble(iMap.get("rwOverL").toString()));
                list.add(iMap);
            });
        }
    }

    private List<TkmSysOrg> getTkmSysOrgs() {
        List<Long> orgIdList = Arrays.stream(cerSysteminitImportInfoMapper.selOrgId().split(",")).map(Long::valueOf).collect(Collectors.toList());
        return orgMapper.selByOrgId(orgIdList);
    }

    @Override
    public Map<String, Object> getCityByHospital() {
        // 获取要统计的医院
        String paramValue = cerSysteminitImportInfoMapper.selOrgId();
        List<Long> orgIdList = Arrays.stream(paramValue.split(",")).map(Long::valueOf).collect(Collectors.toList());
        // 查询医院所属的城市
        List<TkmSysOrg> orgList = orgMapper.selByOrgId(orgIdList);
        List<Map<String, Object>> cityInfoList = orgMapper.selCityByOrgId(orgIdList);
        cityInfoList.forEach(item -> item.put("org", orgList.stream().filter(org -> org.getCityCode().equals(item.get("city_code"))).collect(Collectors.toList())));
        Map<String, Object> map = new HashMap<>();
        map.put("city", cityInfoList);
        return map;
    }

    // 数据转换，仅限工作统计用
    private Map<String, LinkedHashMap<String, Object>> dataConversion(List<LinkedHashMap<String, Object>> linkedHashMapList) {
        if (StringUtils.isEmpty(linkedHashMapList)) {
            Map<String, LinkedHashMap<String, Object>> returnMap = new HashMap<>();
            LinkedHashMap<String, Object> map = new LinkedHashMap<>();
            map.put("0", "0");
            returnMap.put("0", map);
            return returnMap;
        }
        return linkedHashMapList.stream().collect(Collectors.toMap(item -> String.valueOf(item.get("orgId")), Function.identity()));
    }

    // 数据转换，乘以100，保留两位小数
    private String stringFormat(Double d) {
        return String.format("%.2f", d * 100);
    }
}
